home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / sound / asound.h < prev    next >
C/C++ Source or Header  |  2006-01-09  |  37KB  |  938 lines

  1. /*
  2.  *  Advanced Linux Sound Architecture - ALSA - Driver
  3.  *  Copyright (c) 1994-2003 by Jaroslav Kysela <perex@suse.cz>,
  4.  *                             Abramo Bagnara <abramo@alsa-project.org>
  5.  *
  6.  *
  7.  *   This program is free software; you can redistribute it and/or modify
  8.  *   it under the terms of the GNU General Public License as published by
  9.  *   the Free Software Foundation; either version 2 of the License, or
  10.  *   (at your option) any later version.
  11.  *
  12.  *   This program is distributed in the hope that it will be useful,
  13.  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  *   GNU General Public License for more details.
  16.  *
  17.  *   You should have received a copy of the GNU General Public License
  18.  *   along with this program; if not, write to the Free Software
  19.  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  20.  *
  21.  */
  22.  
  23. #ifndef __SOUND_ASOUND_H
  24. #define __SOUND_ASOUND_H
  25.  
  26. #if defined(LINUX) || defined(__LINUX__) || defined(__linux__)
  27.  
  28. #include <linux/ioctl.h>
  29.  
  30. #ifdef __KERNEL__
  31.  
  32. #include <linux/types.h>
  33. #include <linux/time.h>
  34. #include <asm/byteorder.h>
  35.  
  36. #ifdef  __LITTLE_ENDIAN
  37. #define SNDRV_LITTLE_ENDIAN
  38. #else
  39. #ifdef __BIG_ENDIAN
  40. #define SNDRV_BIG_ENDIAN
  41. #else
  42. #error "Unsupported endian..."
  43. #endif
  44. #endif
  45.  
  46. #else /* !__KERNEL__ */
  47.  
  48. #include <endian.h>
  49. #if __BYTE_ORDER == __LITTLE_ENDIAN
  50. #define SNDRV_LITTLE_ENDIAN
  51. #elif __BYTE_ORDER == __BIG_ENDIAN
  52. #define SNDRV_BIG_ENDIAN
  53. #else
  54. #error "Unsupported endian..."
  55. #endif
  56.  
  57. #endif /* __KERNEL **/
  58.  
  59. #endif /* LINUX */
  60.  
  61. #ifndef __KERNEL__
  62. #include <sys/time.h>
  63. #include <sys/types.h>
  64. #endif
  65.  
  66. #ifndef __user
  67. #define __user
  68. #endif
  69.  
  70. /*
  71.  *  protocol version
  72.  */
  73.  
  74. #define SNDRV_PROTOCOL_VERSION(major, minor, subminor) (((major)<<16)|((minor)<<8)|(subminor))
  75. #define SNDRV_PROTOCOL_MAJOR(version) (((version)>>16)&0xffff)
  76. #define SNDRV_PROTOCOL_MINOR(version) (((version)>>8)&0xff)
  77. #define SNDRV_PROTOCOL_MICRO(version) ((version)&0xff)
  78. #define SNDRV_PROTOCOL_INCOMPATIBLE(kversion, uversion) \
  79.     (SNDRV_PROTOCOL_MAJOR(kversion) != SNDRV_PROTOCOL_MAJOR(uversion) || \
  80.      (SNDRV_PROTOCOL_MAJOR(kversion) == SNDRV_PROTOCOL_MAJOR(uversion) && \
  81.        SNDRV_PROTOCOL_MINOR(kversion) != SNDRV_PROTOCOL_MINOR(uversion)))
  82.  
  83. /****************************************************************************
  84.  *                                                                          *
  85.  *        Digital audio interface                        *
  86.  *                                                                          *
  87.  ****************************************************************************/
  88.  
  89. struct sndrv_aes_iec958 {
  90.     unsigned char status[24];    /* AES/IEC958 channel status bits */
  91.     unsigned char subcode[147];    /* AES/IEC958 subcode bits */
  92.     unsigned char pad;        /* nothing */
  93.     unsigned char dig_subframe[4];    /* AES/IEC958 subframe bits */
  94. };
  95.  
  96. /****************************************************************************
  97.  *                                                                          *
  98.  *      Section for driver hardware dependent interface - /dev/snd/hw?      *
  99.  *                                                                          *
  100.  ****************************************************************************/
  101.  
  102. #define SNDRV_HWDEP_VERSION        SNDRV_PROTOCOL_VERSION(1, 0, 1)
  103.  
  104. enum sndrv_hwdep_iface {
  105.     SNDRV_HWDEP_IFACE_OPL2 = 0,
  106.     SNDRV_HWDEP_IFACE_OPL3,
  107.     SNDRV_HWDEP_IFACE_OPL4,
  108.     SNDRV_HWDEP_IFACE_SB16CSP,    /* Creative Signal Processor */
  109.     SNDRV_HWDEP_IFACE_EMU10K1,    /* FX8010 processor in EMU10K1 chip */
  110.     SNDRV_HWDEP_IFACE_YSS225,    /* Yamaha FX processor */
  111.     SNDRV_HWDEP_IFACE_ICS2115,    /* Wavetable synth */
  112.     SNDRV_HWDEP_IFACE_SSCAPE,    /* Ensoniq SoundScape ISA card (MC68EC000) */
  113.     SNDRV_HWDEP_IFACE_VX,        /* Digigram VX cards */
  114.     SNDRV_HWDEP_IFACE_MIXART,    /* Digigram miXart cards */
  115.     SNDRV_HWDEP_IFACE_USX2Y,    /* Tascam US122, US224 & US428 usb */
  116.     SNDRV_HWDEP_IFACE_EMUX_WAVETABLE, /* EmuX wavetable */    
  117.     SNDRV_HWDEP_IFACE_BLUETOOTH,    /* Bluetooth audio */
  118.     SNDRV_HWDEP_IFACE_USX2Y_PCM,    /* Tascam US122, US224 & US428 rawusb pcm */
  119.     SNDRV_HWDEP_IFACE_PCXHR,    /* Digigram PCXHR */
  120.     SNDRV_HWDEP_IFACE_SB_RC,    /* SB Extigy/Audigy2NX remote control */
  121.  
  122.     /* Don't forget to change the following: */
  123.     SNDRV_HWDEP_IFACE_LAST = SNDRV_HWDEP_IFACE_SB_RC
  124. };
  125.  
  126. struct sndrv_hwdep_info {
  127.     unsigned int device;        /* WR: device number */
  128.     int card;            /* R: card number */
  129.     unsigned char id[64];        /* ID (user selectable) */
  130.     unsigned char name[80];        /* hwdep name */
  131.     enum sndrv_hwdep_iface iface;    /* hwdep interface */
  132.     unsigned char reserved[64];    /* reserved for future */
  133. };
  134.  
  135. /* generic DSP loader */
  136. struct sndrv_hwdep_dsp_status {
  137.     unsigned int version;        /* R: driver-specific version */
  138.     unsigned char id[32];        /* R: driver-specific ID string */
  139.     unsigned int num_dsps;        /* R: number of DSP images to transfer */
  140.     unsigned int dsp_loaded;    /* R: bit flags indicating the loaded DSPs */
  141.     unsigned int chip_ready;    /* R: 1 = initialization finished */
  142.     unsigned char reserved[16];    /* reserved for future use */
  143. };
  144.  
  145. struct sndrv_hwdep_dsp_image {
  146.     unsigned int index;        /* W: DSP index */
  147.     unsigned char name[64];        /* W: ID (e.g. file name) */
  148.     unsigned char __user *image;    /* W: binary image */
  149.     size_t length;            /* W: size of image in bytes */
  150.     unsigned long driver_data;    /* W: driver-specific data */
  151. };
  152.  
  153. enum {
  154.     SNDRV_HWDEP_IOCTL_PVERSION = _IOR ('H', 0x00, int),
  155.     SNDRV_HWDEP_IOCTL_INFO = _IOR ('H', 0x01, struct sndrv_hwdep_info),
  156.     SNDRV_HWDEP_IOCTL_DSP_STATUS = _IOR('H', 0x02, struct sndrv_hwdep_dsp_status),
  157.     SNDRV_HWDEP_IOCTL_DSP_LOAD   = _IOW('H', 0x03, struct sndrv_hwdep_dsp_image)
  158. };
  159.  
  160. /*****************************************************************************
  161.  *                                                                           *
  162.  *             Digital Audio (PCM) interface - /dev/snd/pcm??                *
  163.  *                                                                           *
  164.  *****************************************************************************/
  165.  
  166. #define SNDRV_PCM_VERSION        SNDRV_PROTOCOL_VERSION(2, 0, 7)
  167.  
  168. typedef unsigned long sndrv_pcm_uframes_t;
  169. typedef long sndrv_pcm_sframes_t;
  170.  
  171. enum sndrv_pcm_class {
  172.     SNDRV_PCM_CLASS_GENERIC = 0,    /* standard mono or stereo device */
  173.     SNDRV_PCM_CLASS_MULTI,        /* multichannel device */
  174.     SNDRV_PCM_CLASS_MODEM,        /* software modem class */
  175.     SNDRV_PCM_CLASS_DIGITIZER,    /* digitizer class */
  176.     /* Don't forget to change the following: */
  177.     SNDRV_PCM_CLASS_LAST = SNDRV_PCM_CLASS_DIGITIZER,
  178. };
  179.  
  180. enum sndrv_pcm_subclass {
  181.     SNDRV_PCM_SUBCLASS_GENERIC_MIX = 0, /* mono or stereo subdevices are mixed together */
  182.     SNDRV_PCM_SUBCLASS_MULTI_MIX,    /* multichannel subdevices are mixed together */
  183.     /* Don't forget to change the following: */
  184.     SNDRV_PCM_SUBCLASS_LAST = SNDRV_PCM_SUBCLASS_MULTI_MIX,
  185. };
  186.  
  187. enum sndrv_pcm_stream {
  188.     SNDRV_PCM_STREAM_PLAYBACK = 0,
  189.     SNDRV_PCM_STREAM_CAPTURE,
  190.     SNDRV_PCM_STREAM_LAST = SNDRV_PCM_STREAM_CAPTURE,
  191. };
  192.  
  193. enum sndrv_pcm_access {
  194.     SNDRV_PCM_ACCESS_MMAP_INTERLEAVED = 0,    /* interleaved mmap */
  195.     SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED,     /* noninterleaved mmap */
  196.     SNDRV_PCM_ACCESS_MMAP_COMPLEX,        /* complex mmap */
  197.     SNDRV_PCM_ACCESS_RW_INTERLEAVED,    /* readi/writei */
  198.     SNDRV_PCM_ACCESS_RW_NONINTERLEAVED,    /* readn/writen */
  199.     SNDRV_PCM_ACCESS_LAST = SNDRV_PCM_ACCESS_RW_NONINTERLEAVED,
  200. };
  201.  
  202. enum sndrv_pcm_format {
  203.     SNDRV_PCM_FORMAT_S8 = 0,
  204.     SNDRV_PCM_FORMAT_U8,
  205.     SNDRV_PCM_FORMAT_S16_LE,
  206.     SNDRV_PCM_FORMAT_S16_BE,
  207.     SNDRV_PCM_FORMAT_U16_LE,
  208.     SNDRV_PCM_FORMAT_U16_BE,
  209.     SNDRV_PCM_FORMAT_S24_LE,    /* low three bytes */
  210.     SNDRV_PCM_FORMAT_S24_BE,    /* low three bytes */
  211.     SNDRV_PCM_FORMAT_U24_LE,    /* low three bytes */
  212.     SNDRV_PCM_FORMAT_U24_BE,    /* low three bytes */
  213.     SNDRV_PCM_FORMAT_S32_LE,
  214.     SNDRV_PCM_FORMAT_S32_BE,
  215.     SNDRV_PCM_FORMAT_U32_LE,
  216.     SNDRV_PCM_FORMAT_U32_BE,
  217.     SNDRV_PCM_FORMAT_FLOAT_LE,    /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */
  218.     SNDRV_PCM_FORMAT_FLOAT_BE,    /* 4-byte float, IEEE-754 32-bit, range -1.0 to 1.0 */
  219.     SNDRV_PCM_FORMAT_FLOAT64_LE,    /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */
  220.     SNDRV_PCM_FORMAT_FLOAT64_BE,    /* 8-byte float, IEEE-754 64-bit, range -1.0 to 1.0 */
  221.     SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE,    /* IEC-958 subframe, Little Endian */
  222.     SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE,    /* IEC-958 subframe, Big Endian */
  223.     SNDRV_PCM_FORMAT_MU_LAW,
  224.     SNDRV_PCM_FORMAT_A_LAW,
  225.     SNDRV_PCM_FORMAT_IMA_ADPCM,
  226.     SNDRV_PCM_FORMAT_MPEG,
  227.     SNDRV_PCM_FORMAT_GSM,
  228.     SNDRV_PCM_FORMAT_SPECIAL = 31,
  229.     SNDRV_PCM_FORMAT_S24_3LE = 32,    /* in three bytes */
  230.     SNDRV_PCM_FORMAT_S24_3BE,    /* in three bytes */
  231.     SNDRV_PCM_FORMAT_U24_3LE,    /* in three bytes */
  232.     SNDRV_PCM_FORMAT_U24_3BE,    /* in three bytes */
  233.     SNDRV_PCM_FORMAT_S20_3LE,    /* in three bytes */
  234.     SNDRV_PCM_FORMAT_S20_3BE,    /* in three bytes */
  235.     SNDRV_PCM_FORMAT_U20_3LE,    /* in three bytes */
  236.     SNDRV_PCM_FORMAT_U20_3BE,    /* in three bytes */
  237.     SNDRV_PCM_FORMAT_S18_3LE,    /* in three bytes */
  238.     SNDRV_PCM_FORMAT_S18_3BE,    /* in three bytes */
  239.     SNDRV_PCM_FORMAT_U18_3LE,    /* in three bytes */
  240.     SNDRV_PCM_FORMAT_U18_3BE,    /* in three bytes */
  241.     SNDRV_PCM_FORMAT_LAST = SNDRV_PCM_FORMAT_U18_3BE,
  242.  
  243. #ifdef SNDRV_LITTLE_ENDIAN
  244.     SNDRV_PCM_FORMAT_S16 = SNDRV_PCM_FORMAT_S16_LE,
  245.     SNDRV_PCM_FORMAT_U16 = SNDRV_PCM_FORMAT_U16_LE,
  246.     SNDRV_PCM_FORMAT_S24 = SNDRV_PCM_FORMAT_S24_LE,
  247.     SNDRV_PCM_FORMAT_U24 = SNDRV_PCM_FORMAT_U24_LE,
  248.     SNDRV_PCM_FORMAT_S32 = SNDRV_PCM_FORMAT_S32_LE,
  249.     SNDRV_PCM_FORMAT_U32 = SNDRV_PCM_FORMAT_U32_LE,
  250.     SNDRV_PCM_FORMAT_FLOAT = SNDRV_PCM_FORMAT_FLOAT_LE,
  251.     SNDRV_PCM_FORMAT_FLOAT64 = SNDRV_PCM_FORMAT_FLOAT64_LE,
  252.     SNDRV_PCM_FORMAT_IEC958_SUBFRAME = SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE,
  253. #endif
  254. #ifdef SNDRV_BIG_ENDIAN
  255.     SNDRV_PCM_FORMAT_S16 = SNDRV_PCM_FORMAT_S16_BE,
  256.     SNDRV_PCM_FORMAT_U16 = SNDRV_PCM_FORMAT_U16_BE,
  257.     SNDRV_PCM_FORMAT_S24 = SNDRV_PCM_FORMAT_S24_BE,
  258.     SNDRV_PCM_FORMAT_U24 = SNDRV_PCM_FORMAT_U24_BE,
  259.     SNDRV_PCM_FORMAT_S32 = SNDRV_PCM_FORMAT_S32_BE,
  260.     SNDRV_PCM_FORMAT_U32 = SNDRV_PCM_FORMAT_U32_BE,
  261.     SNDRV_PCM_FORMAT_FLOAT = SNDRV_PCM_FORMAT_FLOAT_BE,
  262.     SNDRV_PCM_FORMAT_FLOAT64 = SNDRV_PCM_FORMAT_FLOAT64_BE,
  263.     SNDRV_PCM_FORMAT_IEC958_SUBFRAME = SNDRV_PCM_FORMAT_IEC958_SUBFRAME_BE,
  264. #endif
  265. };
  266.  
  267. enum sndrv_pcm_subformat {
  268.     SNDRV_PCM_SUBFORMAT_STD = 0,
  269.     SNDRV_PCM_SUBFORMAT_LAST = SNDRV_PCM_SUBFORMAT_STD,
  270. };
  271.  
  272. #define SNDRV_PCM_INFO_MMAP        0x00000001    /* hardware supports mmap */
  273. #define SNDRV_PCM_INFO_MMAP_VALID    0x00000002    /* period data are valid during transfer */
  274. #define SNDRV_PCM_INFO_DOUBLE        0x00000004    /* Double buffering needed for PCM start/stop */
  275. #define SNDRV_PCM_INFO_BATCH        0x00000010    /* double buffering */
  276. #define SNDRV_PCM_INFO_INTERLEAVED    0x00000100    /* channels are interleaved */
  277. #define SNDRV_PCM_INFO_NONINTERLEAVED    0x00000200    /* channels are not interleaved */
  278. #define SNDRV_PCM_INFO_COMPLEX        0x00000400    /* complex frame organization (mmap only) */
  279. #define SNDRV_PCM_INFO_BLOCK_TRANSFER    0x00010000    /* hardware transfer block of samples */
  280. #define SNDRV_PCM_INFO_OVERRANGE    0x00020000    /* hardware supports ADC (capture) overrange detection */
  281. #define SNDRV_PCM_INFO_RESUME        0x00040000    /* hardware supports stream resume after suspend */
  282. #define SNDRV_PCM_INFO_PAUSE        0x00080000    /* pause ioctl is supported */
  283. #define SNDRV_PCM_INFO_HALF_DUPLEX    0x00100000    /* only half duplex */
  284. #define SNDRV_PCM_INFO_JOINT_DUPLEX    0x00200000    /* playback and capture stream are somewhat correlated */
  285. #define SNDRV_PCM_INFO_SYNC_START    0x00400000    /* pcm support some kind of sync go */
  286.  
  287. enum sndrv_pcm_state {
  288.     SNDRV_PCM_STATE_OPEN = 0,    /* stream is open */
  289.     SNDRV_PCM_STATE_SETUP,        /* stream has a setup */
  290.     SNDRV_PCM_STATE_PREPARED,    /* stream is ready to start */
  291.     SNDRV_PCM_STATE_RUNNING,    /* stream is running */
  292.     SNDRV_PCM_STATE_XRUN,        /* stream reached an xrun */
  293.     SNDRV_PCM_STATE_DRAINING,    /* stream is draining */
  294.     SNDRV_PCM_STATE_PAUSED,        /* stream is paused */
  295.     SNDRV_PCM_STATE_SUSPENDED,    /* hardware is suspended */
  296.     SNDRV_PCM_STATE_DISCONNECTED,    /* hardware is disconnected */
  297.     SNDRV_PCM_STATE_LAST = SNDRV_PCM_STATE_DISCONNECTED,
  298. };
  299.  
  300. enum {
  301.     SNDRV_PCM_MMAP_OFFSET_DATA = 0x00000000,
  302.     SNDRV_PCM_MMAP_OFFSET_STATUS = 0x80000000,
  303.     SNDRV_PCM_MMAP_OFFSET_CONTROL = 0x81000000,
  304. };
  305.  
  306. union sndrv_pcm_sync_id {
  307.     unsigned char id[16];
  308.     unsigned short id16[8];
  309.     unsigned int id32[4];
  310. };
  311.  
  312. struct sndrv_pcm_info {
  313.     unsigned int device;        /* RO/WR (control): device number */
  314.     unsigned int subdevice;        /* RO/WR (control): subdevice number */
  315.     enum sndrv_pcm_stream stream;    /* RO/WR (control): stream number */
  316.     int card;            /* R: card number */
  317.     unsigned char id[64];        /* ID (user selectable) */
  318.     unsigned char name[80];        /* name of this device */
  319.     unsigned char subname[32];    /* subdevice name */
  320.     enum sndrv_pcm_class dev_class;    /* SNDRV_PCM_CLASS_* */
  321.     enum sndrv_pcm_subclass dev_subclass; /* SNDRV_PCM_SUBCLASS_* */
  322.     unsigned int subdevices_count;
  323.     unsigned int subdevices_avail;
  324.     union sndrv_pcm_sync_id sync;    /* hardware synchronization ID */
  325.     unsigned char reserved[64];    /* reserved for future... */
  326. };
  327.  
  328. enum sndrv_pcm_hw_param {
  329.     SNDRV_PCM_HW_PARAM_ACCESS = 0,    /* Access type */
  330.     SNDRV_PCM_HW_PARAM_FIRST_MASK = SNDRV_PCM_HW_PARAM_ACCESS,
  331.     SNDRV_PCM_HW_PARAM_FORMAT,    /* Format */
  332.     SNDRV_PCM_HW_PARAM_SUBFORMAT,    /* Subformat */
  333.     SNDRV_PCM_HW_PARAM_LAST_MASK = SNDRV_PCM_HW_PARAM_SUBFORMAT,
  334.  
  335.     SNDRV_PCM_HW_PARAM_SAMPLE_BITS = 8, /* Bits per sample */
  336.     SNDRV_PCM_HW_PARAM_FIRST_INTERVAL = SNDRV_PCM_HW_PARAM_SAMPLE_BITS,
  337.     SNDRV_PCM_HW_PARAM_FRAME_BITS,    /* Bits per frame */
  338.     SNDRV_PCM_HW_PARAM_CHANNELS,    /* Channels */
  339.     SNDRV_PCM_HW_PARAM_RATE,    /* Approx rate */
  340.     SNDRV_PCM_HW_PARAM_PERIOD_TIME,    /* Approx distance between interrupts
  341.                        in us */
  342.     SNDRV_PCM_HW_PARAM_PERIOD_SIZE,    /* Approx frames between interrupts */
  343.     SNDRV_PCM_HW_PARAM_PERIOD_BYTES, /* Approx bytes between interrupts */
  344.     SNDRV_PCM_HW_PARAM_PERIODS,    /* Approx interrupts per buffer */
  345.     SNDRV_PCM_HW_PARAM_BUFFER_TIME,    /* Approx duration of buffer in us */
  346.     SNDRV_PCM_HW_PARAM_BUFFER_SIZE,    /* Size of buffer in frames */
  347.     SNDRV_PCM_HW_PARAM_BUFFER_BYTES, /* Size of buffer in bytes */
  348.     SNDRV_PCM_HW_PARAM_TICK_TIME,    /* Approx tick duration in us */
  349.     SNDRV_PCM_HW_PARAM_LAST_INTERVAL = SNDRV_PCM_HW_PARAM_TICK_TIME
  350. };
  351.  
  352. #define SNDRV_PCM_HW_PARAMS_NORESAMPLE        (1<<0)    /* avoid rate resampling */
  353.  
  354. struct sndrv_interval {
  355.     unsigned int min, max;
  356.     unsigned int openmin:1,
  357.              openmax:1,
  358.              integer:1,
  359.              empty:1;
  360. };
  361.  
  362. #define SNDRV_MASK_MAX    256
  363.  
  364. struct sndrv_mask {
  365.     u_int32_t bits[(SNDRV_MASK_MAX+31)/32];
  366. };
  367.  
  368. struct sndrv_pcm_hw_params {
  369.     unsigned int flags;
  370.     struct sndrv_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK - 
  371.                    SNDRV_PCM_HW_PARAM_FIRST_MASK + 1];
  372.     struct sndrv_mask mres[5];    /* reserved masks */
  373.     struct sndrv_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL -
  374.                         SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1];
  375.     struct sndrv_interval ires[9];    /* reserved intervals */
  376.     unsigned int rmask;        /* W: requested masks */
  377.     unsigned int cmask;        /* R: changed masks */
  378.     unsigned int info;        /* R: Info flags for returned setup */
  379.     unsigned int msbits;        /* R: used most significant bits */
  380.     unsigned int rate_num;        /* R: rate numerator */
  381.     unsigned int rate_den;        /* R: rate denominator */
  382.     sndrv_pcm_uframes_t fifo_size;    /* R: chip FIFO size in frames */
  383.     unsigned char reserved[64];    /* reserved for future */
  384. };
  385.  
  386. enum sndrv_pcm_tstamp {
  387.     SNDRV_PCM_TSTAMP_NONE = 0,
  388.     SNDRV_PCM_TSTAMP_MMAP,
  389.     SNDRV_PCM_TSTAMP_LAST = SNDRV_PCM_TSTAMP_MMAP,
  390. };
  391.  
  392. struct sndrv_pcm_sw_params {
  393.     enum sndrv_pcm_tstamp tstamp_mode;    /* timestamp mode */
  394.     unsigned int period_step;
  395.     unsigned int sleep_min;            /* min ticks to sleep */
  396.     sndrv_pcm_uframes_t avail_min;        /* min avail frames for wakeup */
  397.     sndrv_pcm_uframes_t xfer_align;        /* xfer size need to be a multiple */
  398.     sndrv_pcm_uframes_t start_threshold;    /* min hw_avail frames for automatic start */
  399.     sndrv_pcm_uframes_t stop_threshold;    /* min avail frames for automatic stop */
  400.     sndrv_pcm_uframes_t silence_threshold;    /* min distance from noise for silence filling */
  401.     sndrv_pcm_uframes_t silence_size;    /* silence block size */
  402.     sndrv_pcm_uframes_t boundary;        /* pointers wrap point */
  403.     unsigned char reserved[64];        /* reserved for future */
  404. };
  405.  
  406. struct sndrv_pcm_channel_info {
  407.     unsigned int channel;
  408.     off_t offset;            /* mmap offset */
  409.     unsigned int first;        /* offset to first sample in bits */
  410.     unsigned int step;        /* samples distance in bits */
  411. };
  412.  
  413. struct sndrv_pcm_status {
  414.     enum sndrv_pcm_state state;    /* stream state */
  415.     struct timespec trigger_tstamp;    /* time when stream was started/stopped/paused */
  416.     struct timespec tstamp;        /* reference timestamp */
  417.     sndrv_pcm_uframes_t appl_ptr;    /* appl ptr */
  418.     sndrv_pcm_uframes_t hw_ptr;    /* hw ptr */
  419.     sndrv_pcm_sframes_t delay;    /* current delay in frames */
  420.     sndrv_pcm_uframes_t avail;    /* number of frames available */
  421.     sndrv_pcm_uframes_t avail_max;    /* max frames available on hw since last status */
  422.     sndrv_pcm_uframes_t overrange;    /* count of ADC (capture) overrange detections from last status */
  423.     enum sndrv_pcm_state suspended_state; /* suspended stream state */
  424.     unsigned char reserved[60];    /* must be filled with zero */
  425. };
  426.  
  427. struct sndrv_pcm_mmap_status {
  428.     enum sndrv_pcm_state state;    /* RO: state - SNDRV_PCM_STATE_XXXX */
  429.     int pad1;            /* Needed for 64 bit alignment */
  430.     sndrv_pcm_uframes_t hw_ptr;    /* RO: hw ptr (0...boundary-1) */
  431.     struct timespec tstamp;        /* Timestamp */
  432.     enum sndrv_pcm_state suspended_state; /* RO: suspended stream state */
  433. };
  434.  
  435. struct sndrv_pcm_mmap_control {
  436.     sndrv_pcm_uframes_t appl_ptr;    /* RW: appl ptr (0...boundary-1) */
  437.     sndrv_pcm_uframes_t avail_min;    /* RW: min available frames for wakeup */
  438. };
  439.  
  440. #define SNDRV_PCM_SYNC_PTR_HWSYNC    (1<<0)    /* execute hwsync */
  441. #define SNDRV_PCM_SYNC_PTR_APPL        (1<<1)    /* get appl_ptr from driver (r/w op) */
  442. #define SNDRV_PCM_SYNC_PTR_AVAIL_MIN    (1<<2)    /* get avail_min from driver */
  443.  
  444. struct sndrv_pcm_sync_ptr {
  445.     unsigned int flags;
  446.     union {
  447.         struct sndrv_pcm_mmap_status status;
  448.         unsigned char reserved[64];
  449.     } s;
  450.     union {
  451.         struct sndrv_pcm_mmap_control control;
  452.         unsigned char reserved[64];
  453.     } c;
  454. };
  455.  
  456. struct sndrv_xferi {
  457.     sndrv_pcm_sframes_t result;
  458.     void __user *buf;
  459.     sndrv_pcm_uframes_t frames;
  460. };
  461.  
  462. struct sndrv_xfern {
  463.     sndrv_pcm_sframes_t result;
  464.     void __user * __user *bufs;
  465.     sndrv_pcm_uframes_t frames;
  466. };
  467.  
  468. enum {
  469.     SNDRV_PCM_IOCTL_PVERSION = _IOR('A', 0x00, int),
  470.     SNDRV_PCM_IOCTL_INFO = _IOR('A', 0x01, struct sndrv_pcm_info),
  471.     SNDRV_PCM_IOCTL_TSTAMP = _IOW('A', 0x02, int),
  472.     SNDRV_PCM_IOCTL_HW_REFINE = _IOWR('A', 0x10, struct sndrv_pcm_hw_params),
  473.     SNDRV_PCM_IOCTL_HW_PARAMS = _IOWR('A', 0x11, struct sndrv_pcm_hw_params),
  474.     SNDRV_PCM_IOCTL_HW_FREE = _IO('A', 0x12),
  475.     SNDRV_PCM_IOCTL_SW_PARAMS = _IOWR('A', 0x13, struct sndrv_pcm_sw_params),
  476.     SNDRV_PCM_IOCTL_STATUS = _IOR('A', 0x20, struct sndrv_pcm_status),
  477.     SNDRV_PCM_IOCTL_DELAY = _IOR('A', 0x21, sndrv_pcm_sframes_t),
  478.     SNDRV_PCM_IOCTL_HWSYNC = _IO('A', 0x22),
  479.     SNDRV_PCM_IOCTL_SYNC_PTR = _IOWR('A', 0x23, struct sndrv_pcm_sync_ptr),
  480.     SNDRV_PCM_IOCTL_CHANNEL_INFO = _IOR('A', 0x32, struct sndrv_pcm_channel_info),
  481.     SNDRV_PCM_IOCTL_PREPARE = _IO('A', 0x40),
  482.     SNDRV_PCM_IOCTL_RESET = _IO('A', 0x41),
  483.     SNDRV_PCM_IOCTL_START = _IO('A', 0x42),
  484.     SNDRV_PCM_IOCTL_DROP = _IO('A', 0x43),
  485.     SNDRV_PCM_IOCTL_DRAIN = _IO('A', 0x44),
  486.     SNDRV_PCM_IOCTL_PAUSE = _IOW('A', 0x45, int),
  487.     SNDRV_PCM_IOCTL_REWIND = _IOW('A', 0x46, sndrv_pcm_uframes_t),
  488.     SNDRV_PCM_IOCTL_RESUME = _IO('A', 0x47),
  489.     SNDRV_PCM_IOCTL_XRUN = _IO('A', 0x48),
  490.     SNDRV_PCM_IOCTL_FORWARD = _IOW('A', 0x49, sndrv_pcm_uframes_t),
  491.     SNDRV_PCM_IOCTL_WRITEI_FRAMES = _IOW('A', 0x50, struct sndrv_xferi),
  492.     SNDRV_PCM_IOCTL_READI_FRAMES = _IOR('A', 0x51, struct sndrv_xferi),
  493.     SNDRV_PCM_IOCTL_WRITEN_FRAMES = _IOW('A', 0x52, struct sndrv_xfern),
  494.     SNDRV_PCM_IOCTL_READN_FRAMES = _IOR('A', 0x53, struct sndrv_xfern),
  495.     SNDRV_PCM_IOCTL_LINK = _IOW('A', 0x60, int),
  496.     SNDRV_PCM_IOCTL_UNLINK = _IO('A', 0x61),
  497. };
  498.  
  499. /* Trick to make alsa-lib/acinclude.m4 happy */
  500. #define SNDRV_PCM_IOCTL_REWIND SNDRV_PCM_IOCTL_REWIND
  501.  
  502. /*****************************************************************************
  503.  *                                                                           *
  504.  *                            MIDI v1.0 interface                            *
  505.  *                                                                           *
  506.  *****************************************************************************/
  507.  
  508. /*
  509.  *  Raw MIDI section - /dev/snd/midi??
  510.  */
  511.  
  512. #define SNDRV_RAWMIDI_VERSION        SNDRV_PROTOCOL_VERSION(2, 0, 0)
  513.  
  514. enum sndrv_rawmidi_stream {
  515.     SNDRV_RAWMIDI_STREAM_OUTPUT = 0,
  516.     SNDRV_RAWMIDI_STREAM_INPUT,
  517.     SNDRV_RAWMIDI_STREAM_LAST = SNDRV_RAWMIDI_STREAM_INPUT,
  518. };
  519.  
  520. #define SNDRV_RAWMIDI_INFO_OUTPUT        0x00000001
  521. #define SNDRV_RAWMIDI_INFO_INPUT        0x00000002
  522. #define SNDRV_RAWMIDI_INFO_DUPLEX        0x00000004
  523.  
  524. struct sndrv_rawmidi_info {
  525.     unsigned int device;        /* RO/WR (control): device number */
  526.     unsigned int subdevice;        /* RO/WR (control): subdevice number */
  527.     enum sndrv_rawmidi_stream stream; /* WR: stream */
  528.     int card;            /* R: card number */
  529.     unsigned int flags;        /* SNDRV_RAWMIDI_INFO_XXXX */
  530.     unsigned char id[64];        /* ID (user selectable) */
  531.     unsigned char name[80];        /* name of device */
  532.     unsigned char subname[32];    /* name of active or selected subdevice */
  533.     unsigned int subdevices_count;
  534.     unsigned int subdevices_avail;
  535.     unsigned char reserved[64];    /* reserved for future use */
  536. };
  537.  
  538. struct sndrv_rawmidi_params {
  539.     enum sndrv_rawmidi_stream stream;
  540.     size_t buffer_size;        /* queue size in bytes */
  541.     size_t avail_min;        /* minimum avail bytes for wakeup */
  542.     unsigned int no_active_sensing: 1; /* do not send active sensing byte in close() */
  543.     unsigned char reserved[16];    /* reserved for future use */
  544. };
  545.  
  546. struct sndrv_rawmidi_status {
  547.     enum sndrv_rawmidi_stream stream;
  548.     struct timespec tstamp;        /* Timestamp */
  549.     size_t avail;            /* available bytes */
  550.     size_t xruns;            /* count of overruns since last status (in bytes) */
  551.     unsigned char reserved[16];    /* reserved for future use */
  552. };
  553.  
  554. enum {
  555.     SNDRV_RAWMIDI_IOCTL_PVERSION = _IOR('W', 0x00, int),
  556.     SNDRV_RAWMIDI_IOCTL_INFO = _IOR('W', 0x01, struct sndrv_rawmidi_info),
  557.     SNDRV_RAWMIDI_IOCTL_PARAMS = _IOWR('W', 0x10, struct sndrv_rawmidi_params),
  558.     SNDRV_RAWMIDI_IOCTL_STATUS = _IOWR('W', 0x20, struct sndrv_rawmidi_status),
  559.     SNDRV_RAWMIDI_IOCTL_DROP = _IOW('W', 0x30, int),
  560.     SNDRV_RAWMIDI_IOCTL_DRAIN = _IOW('W', 0x31, int),
  561. };
  562.  
  563. /*
  564.  *  Timer section - /dev/snd/timer
  565.  */
  566.  
  567. #define SNDRV_TIMER_VERSION        SNDRV_PROTOCOL_VERSION(2, 0, 5)
  568.  
  569. enum sndrv_timer_class {
  570.     SNDRV_TIMER_CLASS_NONE = -1,
  571.     SNDRV_TIMER_CLASS_SLAVE = 0,
  572.     SNDRV_TIMER_CLASS_GLOBAL,
  573.     SNDRV_TIMER_CLASS_CARD,
  574.     SNDRV_TIMER_CLASS_PCM,
  575.     SNDRV_TIMER_CLASS_LAST = SNDRV_TIMER_CLASS_PCM,
  576. };
  577.  
  578. /* slave timer classes */
  579. enum sndrv_timer_slave_class {
  580.     SNDRV_TIMER_SCLASS_NONE = 0,
  581.     SNDRV_TIMER_SCLASS_APPLICATION,
  582.     SNDRV_TIMER_SCLASS_SEQUENCER,        /* alias */
  583.     SNDRV_TIMER_SCLASS_OSS_SEQUENCER,    /* alias */
  584.     SNDRV_TIMER_SCLASS_LAST = SNDRV_TIMER_SCLASS_OSS_SEQUENCER,
  585. };
  586.  
  587. /* global timers (device member) */
  588. #define SNDRV_TIMER_GLOBAL_SYSTEM    0
  589. #define SNDRV_TIMER_GLOBAL_RTC        1
  590. #define SNDRV_TIMER_GLOBAL_HPET        2
  591.  
  592. /* info flags */
  593. #define SNDRV_TIMER_FLG_SLAVE        (1<<0)    /* cannot be controlled */
  594.  
  595. struct sndrv_timer_id {
  596.     enum sndrv_timer_class dev_class;    
  597.     enum sndrv_timer_slave_class dev_sclass;
  598.     int card;
  599.     int device;
  600.     int subdevice;
  601. };
  602.  
  603. struct sndrv_timer_ginfo {
  604.     struct sndrv_timer_id tid;    /* requested timer ID */
  605.     unsigned int flags;        /* timer flags - SNDRV_TIMER_FLG_* */
  606.     int card;            /* card number */
  607.     unsigned char id[64];        /* timer identification */
  608.     unsigned char name[80];        /* timer name */
  609.     unsigned long reserved0;    /* reserved for future use */
  610.     unsigned long resolution;    /* average period resolution in ns */
  611.     unsigned long resolution_min;    /* minimal period resolution in ns */
  612.     unsigned long resolution_max;    /* maximal period resolution in ns */
  613.     unsigned int clients;        /* active timer clients */
  614.     unsigned char reserved[32];
  615. };
  616.  
  617. struct sndrv_timer_gparams {
  618.     struct sndrv_timer_id tid;    /* requested timer ID */
  619.     unsigned long period_num;    /* requested precise period duration (in seconds) - numerator */
  620.     unsigned long period_den;    /* requested precise period duration (in seconds) - denominator */
  621.     unsigned char reserved[32];
  622. };
  623.  
  624. struct sndrv_timer_gstatus {
  625.     struct sndrv_timer_id tid;    /* requested timer ID */
  626.     unsigned long resolution;    /* current period resolution in ns */
  627.     unsigned long resolution_num;    /* precise current period resolution (in seconds) - numerator */
  628.     unsigned long resolution_den;    /* precise current period resolution (in seconds) - denominator */
  629.     unsigned char reserved[32];
  630. };
  631.  
  632. struct sndrv_timer_select {
  633.     struct sndrv_timer_id id;    /* bind to timer ID */
  634.     unsigned char reserved[32];    /* reserved */
  635. };
  636.  
  637. struct sndrv_timer_info {
  638.     unsigned int flags;        /* timer flags - SNDRV_TIMER_FLG_* */
  639.     int card;            /* card number */
  640.     unsigned char id[64];        /* timer identificator */
  641.     unsigned char name[80];        /* timer name */
  642.     unsigned long reserved0;    /* reserved for future use */
  643.     unsigned long resolution;    /* average period resolution in ns */
  644.     unsigned char reserved[64];    /* reserved */
  645. };
  646.  
  647. #define SNDRV_TIMER_PSFLG_AUTO        (1<<0)    /* auto start, otherwise one-shot */
  648. #define SNDRV_TIMER_PSFLG_EXCLUSIVE    (1<<1)    /* exclusive use, precise start/stop/pause/continue */
  649. #define SNDRV_TIMER_PSFLG_EARLY_EVENT    (1<<2)    /* write early event to the poll queue */
  650.  
  651. struct sndrv_timer_params {
  652.     unsigned int flags;        /* flags - SNDRV_MIXER_PSFLG_* */
  653.     unsigned int ticks;        /* requested resolution in ticks */
  654.     unsigned int queue_size;    /* total size of queue (32-1024) */
  655.     unsigned int reserved0;        /* reserved, was: failure locations */
  656.     unsigned int filter;        /* event filter (bitmask of SNDRV_TIMER_EVENT_*) */
  657.     unsigned char reserved[60];    /* reserved */
  658. };
  659.  
  660. struct sndrv_timer_status {
  661.     struct timespec tstamp;        /* Timestamp - last update */
  662.     unsigned int resolution;    /* current period resolution in ns */
  663.     unsigned int lost;        /* counter of master tick lost */
  664.     unsigned int overrun;        /* count of read queue overruns */
  665.     unsigned int queue;        /* used queue size */
  666.     unsigned char reserved[64];    /* reserved */
  667. };
  668.  
  669. enum {
  670.     SNDRV_TIMER_IOCTL_PVERSION = _IOR('T', 0x00, int),
  671.     SNDRV_TIMER_IOCTL_NEXT_DEVICE = _IOWR('T', 0x01, struct sndrv_timer_id),
  672.     SNDRV_TIMER_IOCTL_TREAD = _IOW('T', 0x02, int),
  673.     SNDRV_TIMER_IOCTL_GINFO = _IOWR('T', 0x03, struct sndrv_timer_ginfo),
  674.     SNDRV_TIMER_IOCTL_GPARAMS = _IOW('T', 0x04, struct sndrv_timer_gparams),
  675.     SNDRV_TIMER_IOCTL_GSTATUS = _IOWR('T', 0x05, struct sndrv_timer_gstatus),
  676.     SNDRV_TIMER_IOCTL_SELECT = _IOW('T', 0x10, struct sndrv_timer_select),
  677.     SNDRV_TIMER_IOCTL_INFO = _IOR('T', 0x11, struct sndrv_timer_info),
  678.     SNDRV_TIMER_IOCTL_PARAMS = _IOW('T', 0x12, struct sndrv_timer_params),
  679.     SNDRV_TIMER_IOCTL_STATUS = _IOR('T', 0x14, struct sndrv_timer_status),
  680.     /* The following four ioctls are changed since 1.0.9 due to confliction */
  681.     SNDRV_TIMER_IOCTL_START = _IO('T', 0xa0),
  682.     SNDRV_TIMER_IOCTL_STOP = _IO('T', 0xa1),
  683.     SNDRV_TIMER_IOCTL_CONTINUE = _IO('T', 0xa2),
  684.     SNDRV_TIMER_IOCTL_PAUSE = _IO('T', 0xa3),
  685. };
  686.  
  687. struct sndrv_timer_read {
  688.     unsigned int resolution;
  689.     unsigned int ticks;
  690. };
  691.  
  692. enum sndrv_timer_event {
  693.     SNDRV_TIMER_EVENT_RESOLUTION = 0,    /* val = resolution in ns */
  694.     SNDRV_TIMER_EVENT_TICK,            /* val = ticks */
  695.     SNDRV_TIMER_EVENT_START,        /* val = resolution in ns */
  696.     SNDRV_TIMER_EVENT_STOP,            /* val = 0 */
  697.     SNDRV_TIMER_EVENT_CONTINUE,        /* val = resolution in ns */
  698.     SNDRV_TIMER_EVENT_PAUSE,        /* val = 0 */
  699.     SNDRV_TIMER_EVENT_EARLY,        /* val = 0, early event */
  700.     SNDRV_TIMER_EVENT_SUSPEND,        /* val = 0 */
  701.     SNDRV_TIMER_EVENT_RESUME,        /* val = resolution in ns */
  702.     /* master timer events for slave timer instances */
  703.     SNDRV_TIMER_EVENT_MSTART = SNDRV_TIMER_EVENT_START + 10,
  704.     SNDRV_TIMER_EVENT_MSTOP = SNDRV_TIMER_EVENT_STOP + 10,
  705.     SNDRV_TIMER_EVENT_MCONTINUE = SNDRV_TIMER_EVENT_CONTINUE + 10,
  706.     SNDRV_TIMER_EVENT_MPAUSE = SNDRV_TIMER_EVENT_PAUSE + 10,
  707.     SNDRV_TIMER_EVENT_MSUSPEND = SNDRV_TIMER_EVENT_SUSPEND + 10,
  708.     SNDRV_TIMER_EVENT_MRESUME = SNDRV_TIMER_EVENT_RESUME + 10,
  709. };
  710.  
  711. struct sndrv_timer_tread {
  712.     enum sndrv_timer_event event;
  713.     struct timespec tstamp;
  714.     unsigned int val;
  715. };
  716.  
  717. /****************************************************************************
  718.  *                                                                          *
  719.  *        Section for driver control interface - /dev/snd/control?          *
  720.  *                                                                          *
  721.  ****************************************************************************/
  722.  
  723. #define SNDRV_CTL_VERSION        SNDRV_PROTOCOL_VERSION(2, 0, 3)
  724.  
  725. struct sndrv_ctl_card_info {
  726.     int card;            /* card number */
  727.     int pad;            /* reserved for future (was type) */
  728.     unsigned char id[16];        /* ID of card (user selectable) */
  729.     unsigned char driver[16];    /* Driver name */
  730.     unsigned char name[32];        /* Short name of soundcard */
  731.     unsigned char longname[80];    /* name + info text about soundcard */
  732.     unsigned char reserved_[16];    /* reserved for future (was ID of mixer) */
  733.     unsigned char mixername[80];    /* visual mixer identification */
  734.     unsigned char components[80];    /* card components / fine identification, delimited with one space (AC97 etc..) */
  735.     unsigned char reserved[48];    /* reserved for future */
  736. };
  737.  
  738. enum sndrv_ctl_elem_type {
  739.     SNDRV_CTL_ELEM_TYPE_NONE = 0,        /* invalid */
  740.     SNDRV_CTL_ELEM_TYPE_BOOLEAN,        /* boolean type */
  741.     SNDRV_CTL_ELEM_TYPE_INTEGER,        /* integer type */
  742.     SNDRV_CTL_ELEM_TYPE_ENUMERATED,        /* enumerated type */
  743.     SNDRV_CTL_ELEM_TYPE_BYTES,        /* byte array */
  744.     SNDRV_CTL_ELEM_TYPE_IEC958,        /* IEC958 (S/PDIF) setup */
  745.     SNDRV_CTL_ELEM_TYPE_INTEGER64,        /* 64-bit integer type */
  746.     SNDRV_CTL_ELEM_TYPE_LAST = SNDRV_CTL_ELEM_TYPE_INTEGER64,
  747. };
  748.  
  749. enum sndrv_ctl_elem_iface {
  750.     SNDRV_CTL_ELEM_IFACE_CARD = 0,        /* global control */
  751.     SNDRV_CTL_ELEM_IFACE_HWDEP,        /* hardware dependent device */
  752.     SNDRV_CTL_ELEM_IFACE_MIXER,        /* virtual mixer device */
  753.     SNDRV_CTL_ELEM_IFACE_PCM,        /* PCM device */
  754.     SNDRV_CTL_ELEM_IFACE_RAWMIDI,        /* RawMidi device */
  755.     SNDRV_CTL_ELEM_IFACE_TIMER,        /* timer device */
  756.     SNDRV_CTL_ELEM_IFACE_SEQUENCER,        /* sequencer client */
  757.     SNDRV_CTL_ELEM_IFACE_LAST = SNDRV_CTL_ELEM_IFACE_SEQUENCER,
  758. };
  759.  
  760. #define SNDRV_CTL_ELEM_ACCESS_READ        (1<<0)
  761. #define SNDRV_CTL_ELEM_ACCESS_WRITE        (1<<1)
  762. #define SNDRV_CTL_ELEM_ACCESS_READWRITE        (SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE)
  763. #define SNDRV_CTL_ELEM_ACCESS_VOLATILE        (1<<2)    /* control value may be changed without a notification */
  764. #define SNDRV_CTL_ELEM_ACCESS_TIMESTAMP        (1<<2)    /* when was control changed */
  765. #define SNDRV_CTL_ELEM_ACCESS_INACTIVE        (1<<8)    /* control does actually nothing, but may be updated */
  766. #define SNDRV_CTL_ELEM_ACCESS_LOCK        (1<<9)    /* write lock */
  767. #define SNDRV_CTL_ELEM_ACCESS_OWNER        (1<<10)    /* write lock owner */
  768. #define SNDRV_CTL_ELEM_ACCESS_USER        (1<<29) /* user space element */
  769. #define SNDRV_CTL_ELEM_ACCESS_DINDIRECT        (1<<30)    /* indirect access for matrix dimensions in the info structure */
  770. #define SNDRV_CTL_ELEM_ACCESS_INDIRECT        (1<<31)    /* indirect access for element value in the value structure */
  771.  
  772. /* for further details see the ACPI and PCI power management specification */
  773. #define SNDRV_CTL_POWER_D0        0x0000    /* full On */
  774. #define SNDRV_CTL_POWER_D1        0x0100    /* partial On */
  775. #define SNDRV_CTL_POWER_D2        0x0200    /* partial On */
  776. #define SNDRV_CTL_POWER_D3        0x0300    /* Off */
  777. #define SNDRV_CTL_POWER_D3hot        (SNDRV_CTL_POWER_D3|0x0000)    /* Off, with power */
  778. #define SNDRV_CTL_POWER_D3cold        (SNDRV_CTL_POWER_D3|0x0001)    /* Off, without power */
  779.  
  780. struct sndrv_ctl_elem_id {
  781.     unsigned int numid;        /* numeric identifier, zero = invalid */
  782.     enum sndrv_ctl_elem_iface iface; /* interface identifier */
  783.     unsigned int device;        /* device/client number */
  784.     unsigned int subdevice;        /* subdevice (substream) number */
  785.         unsigned char name[44];        /* ASCII name of item */
  786.     unsigned int index;        /* index of item */
  787. };
  788.  
  789. struct sndrv_ctl_elem_list {
  790.     unsigned int offset;        /* W: first element ID to get */
  791.     unsigned int space;        /* W: count of element IDs to get */
  792.     unsigned int used;        /* R: count of element IDs set */
  793.     unsigned int count;        /* R: count of all elements */
  794.     struct sndrv_ctl_elem_id __user *pids; /* R: IDs */
  795.     unsigned char reserved[50];
  796. };
  797.  
  798. struct sndrv_ctl_elem_info {
  799.     struct sndrv_ctl_elem_id id;    /* W: element ID */
  800.     enum sndrv_ctl_elem_type type;    /* R: value type - SNDRV_CTL_ELEM_TYPE_* */
  801.     unsigned int access;        /* R: value access (bitmask) - SNDRV_CTL_ELEM_ACCESS_* */
  802.     unsigned int count;        /* count of values */
  803.     pid_t owner;            /* owner's PID of this control */
  804.     union {
  805.         struct {
  806.             long min;        /* R: minimum value */
  807.             long max;        /* R: maximum value */
  808.             long step;        /* R: step (0 variable) */
  809.         } integer;
  810.         struct {
  811.             long long min;        /* R: minimum value */
  812.             long long max;        /* R: maximum value */
  813.             long long step;        /* R: step (0 variable) */
  814.         } integer64;
  815.         struct {
  816.             unsigned int items;    /* R: number of items */
  817.             unsigned int item;    /* W: item number */
  818.             char name[64];        /* R: value name */
  819.         } enumerated;
  820.         unsigned char reserved[128];
  821.     } value;
  822.     union {
  823.         unsigned short d[4];        /* dimensions */
  824.         unsigned short *d_ptr;        /* indirect */
  825.     } dimen;
  826.     unsigned char reserved[64-4*sizeof(unsigned short)];
  827. };
  828.  
  829. struct sndrv_ctl_elem_value {
  830.     struct sndrv_ctl_elem_id id;    /* W: element ID */
  831.     unsigned int indirect: 1;    /* W: use indirect pointer (xxx_ptr member) */
  832.         union {
  833.         union {
  834.             long value[128];
  835.             long *value_ptr;
  836.         } integer;
  837.         union {
  838.             long long value[64];
  839.             long long *value_ptr;
  840.         } integer64;
  841.         union {
  842.             unsigned int item[128];
  843.             unsigned int *item_ptr;
  844.         } enumerated;
  845.         union {
  846.             unsigned char data[512];
  847.             unsigned char *data_ptr;
  848.         } bytes;
  849.         struct sndrv_aes_iec958 iec958;
  850.         } value;                /* RO */
  851.     struct timespec tstamp;
  852.         unsigned char reserved[128-sizeof(struct timespec)];
  853. };
  854.  
  855. enum {
  856.     SNDRV_CTL_IOCTL_PVERSION = _IOR('U', 0x00, int),
  857.     SNDRV_CTL_IOCTL_CARD_INFO = _IOR('U', 0x01, struct sndrv_ctl_card_info),
  858.     SNDRV_CTL_IOCTL_ELEM_LIST = _IOWR('U', 0x10, struct sndrv_ctl_elem_list),
  859.     SNDRV_CTL_IOCTL_ELEM_INFO = _IOWR('U', 0x11, struct sndrv_ctl_elem_info),
  860.     SNDRV_CTL_IOCTL_ELEM_READ = _IOWR('U', 0x12, struct sndrv_ctl_elem_value),
  861.     SNDRV_CTL_IOCTL_ELEM_WRITE = _IOWR('U', 0x13, struct sndrv_ctl_elem_value),
  862.     SNDRV_CTL_IOCTL_ELEM_LOCK = _IOW('U', 0x14, struct sndrv_ctl_elem_id),
  863.     SNDRV_CTL_IOCTL_ELEM_UNLOCK = _IOW('U', 0x15, struct sndrv_ctl_elem_id),
  864.     SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS = _IOWR('U', 0x16, int),
  865.     SNDRV_CTL_IOCTL_ELEM_ADD = _IOWR('U', 0x17, struct sndrv_ctl_elem_info),
  866.     SNDRV_CTL_IOCTL_ELEM_REPLACE = _IOWR('U', 0x18, struct sndrv_ctl_elem_info),
  867.     SNDRV_CTL_IOCTL_ELEM_REMOVE = _IOWR('U', 0x19, struct sndrv_ctl_elem_id),
  868.     SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE = _IOWR('U', 0x20, int),
  869.     SNDRV_CTL_IOCTL_HWDEP_INFO = _IOR('U', 0x21, struct sndrv_hwdep_info),
  870.     SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE = _IOR('U', 0x30, int),
  871.     SNDRV_CTL_IOCTL_PCM_INFO = _IOWR('U', 0x31, struct sndrv_pcm_info),
  872.     SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE = _IOW('U', 0x32, int),
  873.     SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE = _IOWR('U', 0x40, int),
  874.     SNDRV_CTL_IOCTL_RAWMIDI_INFO = _IOWR('U', 0x41, struct sndrv_rawmidi_info),
  875.     SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE = _IOW('U', 0x42, int),
  876.     SNDRV_CTL_IOCTL_POWER = _IOWR('U', 0xd0, int),
  877.     SNDRV_CTL_IOCTL_POWER_STATE = _IOR('U', 0xd1, int),
  878. };
  879.  
  880. /*
  881.  *  Read interface.
  882.  */
  883.  
  884. enum sndrv_ctl_event_type {
  885.     SNDRV_CTL_EVENT_ELEM = 0,
  886.     SNDRV_CTL_EVENT_LAST = SNDRV_CTL_EVENT_ELEM,
  887. };
  888.  
  889. #define SNDRV_CTL_EVENT_MASK_VALUE    (1<<0)    /* element value was changed */
  890. #define SNDRV_CTL_EVENT_MASK_INFO    (1<<1)    /* element info was changed */
  891. #define SNDRV_CTL_EVENT_MASK_ADD    (1<<2)    /* element was added */
  892. #define SNDRV_CTL_EVENT_MASK_REMOVE    (~0U)    /* element was removed */
  893.  
  894. struct sndrv_ctl_event {
  895.     enum sndrv_ctl_event_type type;    /* event type - SNDRV_CTL_EVENT_* */
  896.     union {
  897.         struct {
  898.             unsigned int mask;
  899.             struct sndrv_ctl_elem_id id;
  900.         } elem;
  901.                 unsigned char data8[60];
  902.         } data;
  903. };
  904.  
  905. /*
  906.  *  Control names
  907.  */
  908.  
  909. #define SNDRV_CTL_NAME_NONE                ""
  910. #define SNDRV_CTL_NAME_PLAYBACK                "Playback "
  911. #define SNDRV_CTL_NAME_CAPTURE                "Capture "
  912.  
  913. #define SNDRV_CTL_NAME_IEC958_NONE            ""
  914. #define SNDRV_CTL_NAME_IEC958_SWITCH            "Switch"
  915. #define SNDRV_CTL_NAME_IEC958_VOLUME            "Volume"
  916. #define SNDRV_CTL_NAME_IEC958_DEFAULT            "Default"
  917. #define SNDRV_CTL_NAME_IEC958_MASK            "Mask"
  918. #define SNDRV_CTL_NAME_IEC958_CON_MASK            "Con Mask"
  919. #define SNDRV_CTL_NAME_IEC958_PRO_MASK            "Pro Mask"
  920. #define SNDRV_CTL_NAME_IEC958_PCM_STREAM        "PCM Stream"
  921. #define SNDRV_CTL_NAME_IEC958(expl,direction,what)    "IEC958 " expl SNDRV_CTL_NAME_##direction SNDRV_CTL_NAME_IEC958_##what
  922.  
  923. /*
  924.  *
  925.  */
  926.  
  927. struct sndrv_xferv {
  928.     const struct iovec *vector;
  929.     unsigned long count;
  930. };
  931.  
  932. enum {
  933.     SNDRV_IOCTL_READV = _IOW('K', 0x00, struct sndrv_xferv),
  934.     SNDRV_IOCTL_WRITEV = _IOW('K', 0x01, struct sndrv_xferv),
  935. };
  936.  
  937. #endif /* __SOUND_ASOUND_H */
  938.